package com.zj.dmsproxy.wrapper;

import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson.annotation.JSONField;
import com.zj.dmsproxy.enums.GroupEnum;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;

import java.util.*;

/**
 * @author arthur_zhou
 * @date 2023/11/2 17:17
 */
@Getter
public class GroupWrapper {


    @JSONField(name = "group_by")
    private List<Object> groupBy;

    private LinkedHashMap<String, String> result;

    public GroupWrapper() {
        this.groupBy = new ArrayList<>();
        this.result = new LinkedHashMap<>();
    }

    public GroupWrapper(GroupWrapper groupWrapper) {
        if (Objects.nonNull(groupWrapper)) {
            if (Objects.nonNull(groupWrapper.getGroupBy())) {
                this.groupBy = new ArrayList<>(groupWrapper.getGroupBy());
            }
            if (Objects.nonNull(groupWrapper.getResult())) {
                this.result = new LinkedHashMap<>(groupWrapper.getResult());
            }
        }
    }

    /**
     * 分组字段
     *
     * @param fields 字段
     * @return 自己
     */
    public GroupWrapper groupBy(String... fields) {
        if (Objects.nonNull(fields) && fields.length > 0) {
            groupBy.addAll(Arrays.asList(fields));
        }
        return this;
    }

    /**
     * 分组字段
     *
     * @param fields 字段
     * @return 自己
     */
    public GroupWrapper groupBy(Collection<String> fields) {
        if (CollectionUtil.isNotEmpty(fields)) {
            groupBy.addAll(fields);
        }
        return this;
    }

    /**
     * 分组字段(left函数)
     *
     * @param field 字段
     * @return 自己
     */
    public GroupWrapper groupBy(String field, int length) {
        if (StringUtils.isNotEmpty(field)) {
            groupBy.add(Collections.singletonMap("left", Collections.singletonMap(field, length)));
        }
        return this;
    }

    /**
     * 聚合查询
     *
     * @param group 聚合函数枚举
     * @param field 聚合字段
     * @return 自己
     */
    public GroupWrapper result(GroupEnum group, String field) {
        if (StringUtils.isNotEmpty(field)) {
            result.put(group.name().toLowerCase(), field);
        }
        return this;
    }

    /**
     * 聚合查询
     *
     * @param group 聚合函数
     * @param field 聚合字段
     * @return 自己
     */
    public GroupWrapper result(String group, String field) {
        if (StringUtils.isNotEmpty(group) && StringUtils.isNotEmpty(field)) {
            result.put(group, field);
        }
        return this;
    }
}
